package sv.gob.mh.dgii.ssc.pi.consrapidaestado;

import com.octo.captcha.module.servlet.image.SimpleImageCaptchaServlet;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.ldap.search.LdapUserSearch;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.SessionAttributes;
import sv.gob.mh.dgii.model.CcNitSinMov;
import sv.gob.mh.dgii.model.CcSolicitudes;
import sv.gob.mh.dgii.model.DeCtrlConsulta;
import sv.gob.mh.dgii.model.RcRuc;
import sv.gob.mh.dgii.security.SscUserDetailsImpl;
import sv.gob.mh.dgii.service.cat.TbEstadoService;
import sv.gob.mh.dgii.service.cc.CcNitSinMovLogService;
import sv.gob.mh.dgii.service.cc.CcNitSinMovService;
import sv.gob.mh.dgii.service.cc.CcSolicitudesService;
import sv.gob.mh.dgii.service.cc.DeCtrlConsultaService;
import sv.gob.mh.dgii.service.rc.RcRucService;
import sv.gob.mh.dgii.ssc.constants.DateUtilsCommons;
import sv.gob.mh.dgii.ssc.constants.SSCConstants;
import sv.gob.mh.dgii.ssc.controller.configuration.MainController;
import sv.gob.mh.dgii.ssc.pi.consrapidaestado.form.ConsRapidaEstadoForm;

/**
 *
 * @author reynaldo
 */
@Controller
@SessionAttributes({
    "sessionSSCMenu", "consRapidaEstadoForm"})
public class ConsultaSolvenciaRapidaController extends MainController {

    private final static String SESSION_MENU_NAME = "sessionSSCMenu";
    
    private static final long serialVersionUID = -4454262279890891762L;
    private HttpServletRequest httpServletRequest;
    private HttpServletResponse httpServletResponse;
    @Autowired
    private RcRucService rcRucService;
    @Autowired
    private CcNitSinMovService ccNitSinMovService;
    @Autowired
    private CcSolicitudesService ccSolicitudesService;
    @Autowired
    private DeCtrlConsultaService deCtrlConsultaService;
    private static final String ROOT_ACTION = SSCConstants.PI_ROOT + "consrapidaestado/";
    Log log = LogFactory.getLog(ConsultaSolvenciaRapidaController.class);

    @RequestMapping(value = SSCConstants.PI_ROOT + "consrapidaestado/", method = RequestMethod.GET)
    public String index(HttpServletRequest request,
            Model model) {

        ConsRapidaEstadoForm consRapidaEstadoForm = new ConsRapidaEstadoForm();
        model.addAttribute("consRapidaEstadoForm", consRapidaEstadoForm);


        return ROOT_ACTION + "datosContribuyente";
    }

    @RequestMapping(value = SSCConstants.PI_ROOT + "consrapidaestado/query", method = RequestMethod.POST)
    public String query(HttpServletRequest request, Model model, @ModelAttribute(value = "consRapidaEstadoForm") ConsRapidaEstadoForm consRapidaEstadoForm) {



        String userCaptchaResponse = request.getParameter("jcaptcha");
        boolean captchaPassed = SimpleImageCaptchaServlet.validateResponse(request, userCaptchaResponse);
        if (!captchaPassed) {
            consRapidaEstadoForm.addError("No coincide lo digitado con el Captcha.");
            model.addAttribute("consRapidaEstadoForm", consRapidaEstadoForm);
            return ROOT_ACTION + "messages";
        }

        boolean isEstadoFound = false;

        RcRuc contrib = rcRucService.findByNit(consRapidaEstadoForm.getNit());

        if (contrib == null) {
            consRapidaEstadoForm.addError("NIT NO EXISTE - Vuelva a Intentar");
            model.addAttribute("consRapidaEstadoForm", consRapidaEstadoForm);            
            return ROOT_ACTION + "messages";
        } else {
            consRapidaEstadoForm.setNit(contrib.getNit());
            consRapidaEstadoForm.setNombre(contrib.getNombreCompleto());
        }

        String remoteIP = "172.16.15.7";
        String nit = consRapidaEstadoForm.getNit();
        Date fechaConsulta = Calendar.getInstance().getTime();

        consRapidaEstadoForm.setIp(remoteIP);
        consRapidaEstadoForm.setFechaConsulta(fechaConsulta);

        Long numSolicitud = new Long(0);
        ccNitSinMovService.updateStatusAutoAnalisis(nit, nit, remoteIP);
        
        CcNitSinMov buscarEstado = new CcNitSinMov();
        buscarEstado.setNit(nit);
        
        CcNitSinMov estado = (CcNitSinMov) ccNitSinMovService.findByKey(buscarEstado);
        

        String mEstado = "NA";
        String dCorta = "";
        Date fechaVencimiento = null;

        if (estado != null && estado.getNit() != null) {
            mEstado = estado.getTbEstado().getCestado();
            dCorta = estado.getTbEstado().getDEstadoCorto();
            fechaVencimiento = estado.getFVencimiento();
            if (fechaVencimiento != null && DateUtilsCommons.isBefore(fechaConsulta, fechaVencimiento) && !(SSCConstants.ESTADO_PENDIENTE.equalsIgnoreCase(mEstado)) && !"I".equalsIgnoreCase(mEstado)) {
                isEstadoFound = true;
            } else if (fechaVencimiento == null && ("K".equals(mEstado) || "L".equals(mEstado) || "M".equals(mEstado)
                    || "D".equals(mEstado) || "OR".equals(mEstado) || "MO".equals(mEstado) || "MR".equals(mEstado))) {
                isEstadoFound = true;
            }
        }

        DeCtrlConsulta ctrlConsulta = new DeCtrlConsulta();
        ctrlConsulta.setICorrelativo(deCtrlConsultaService.getNextSequence());
        ctrlConsulta.setNit(nit);
        ctrlConsulta.setMEstado(mEstado);
        ctrlConsulta.setCUsuario(getCUsuarioLoggedOrNot());
        ctrlConsulta.setIpUsuario(remoteIP);
        ctrlConsulta.setFhConsulta(fechaConsulta);
        ctrlConsulta.setFVencimiento(fechaVencimiento);
        ctrlConsulta.setCDestino("0010");//TODO: Confirmar con Doris este valor: 16200
        ctrlConsulta.setMNotificado("N");
        ctrlConsulta.setBImpreso(new Boolean(false));
        ctrlConsulta.setBAlmacenado(new Boolean(false));
        
        
        
        deCtrlConsultaService.save(ctrlConsulta);

        numSolicitud = ctrlConsulta.getICorrelativo();

        CcSolicitudes solicitud = ccSolicitudesService.findSolicitudActivaByNit(consRapidaEstadoForm.getNit());
        if (SSCConstants.ESTADO_PENDIENTE.equalsIgnoreCase(mEstado) || solicitud != null && solicitud.getCsolicitud() != null) {// || descomentado por FPEMP
            consRapidaEstadoForm.addError("EXISTE UNA SOLICITUD EN PROCESO");
            model.addAttribute("consRapidaEstadoForm", consRapidaEstadoForm);            
            return ROOT_ACTION + "messages";
        }

        
        if (!isEstadoFound) {
            consRapidaEstadoForm.setDestadoContrib("Pendiente");
            consRapidaEstadoForm.setCorrelativoConsulta(ctrlConsulta.getICorrelativo());
            return ROOT_ACTION + "messages";
        } else {
            //buscar la ultima solicitud para presentar el numero.
            Long numSol = new Long(0);

            CcSolicitudes findSol = new CcSolicitudes();
            findSol.setSnitContrib(nit);
            List<CcSolicitudes> foundList = null;
            foundList = ccSolicitudesService.find(findSol);

            for (Iterator iterator = foundList.iterator(); iterator.hasNext();) {
                CcSolicitudes ccSolicitudesDto = (CcSolicitudes) iterator.next();
                if (ccSolicitudesDto.getCsolicitud() != null && ccSolicitudesDto.getCsolicitud().compareTo(numSol) > 0) {
                    numSol = ccSolicitudesDto.getCsolicitud();
                }
            }

            consRapidaEstadoForm.setCorrelativoConsulta(ctrlConsulta.getICorrelativo());
            consRapidaEstadoForm.setNumeroSolicitud(numSolicitud);
            consRapidaEstadoForm.setNit(nit);
            consRapidaEstadoForm.setNombre(contrib.getNombreCompleto());
            consRapidaEstadoForm.setFechaConsulta(fechaConsulta);
            consRapidaEstadoForm.setDestadoContrib(dCorta);
            consRapidaEstadoForm.setEstadoContrib(mEstado);
            consRapidaEstadoForm.setFechaVigencia(fechaVencimiento);
            consRapidaEstadoForm.setCunidadGenera("0010");
            
            model.addAttribute("consRapidaEstadoForm", consRapidaEstadoForm);
            
            return ROOT_ACTION + "query";
         }

    }

    /**
     * @return the httpServletRequest
     */
    public HttpServletRequest getHttpServletRequest() {
        return httpServletRequest;
    }

    /**
     * @param httpServletRequest the httpServletRequest to set
     */
    public void setHttpServletRequest(HttpServletRequest httpServletRequest) {
        this.httpServletRequest = httpServletRequest;
    }

    /**
     * @return the httpServletResponse
     */
    public HttpServletResponse getHttpServletResponse() {
        return httpServletResponse;
    }

    /**
     * @param httpServletResponse the httpServletResponse to set
     */
    public void setHttpServletResponse(HttpServletResponse httpServletResponse) {
        this.httpServletResponse = httpServletResponse;
    }

    private String getCUsuarioLoggedOrNot() {
        String ret = SSCConstants.USUARIO_CONSULTA_LIBRE;
        RcRuc loggedUser = null;

        try {
            SscUserDetailsImpl user = getPrincipal();
            if (user != null && user.getNit() != null) {
                loggedUser = rcRucService.findByNit(user.getNit());
                if (loggedUser != null) {
                    ret = loggedUser.getNit();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return ret;
    }
}
